<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="fs4BZ" id="fs4BZ"><span data-lake-id="u81d00fd1" id="u81d00fd1">典型回答</span></h1>
  <p data-lake-id="u1a6649c6" id="u1a6649c6"><br></p>
  <p data-lake-id="u07ff923d" id="u07ff923d"><span data-lake-id="u44a27612" id="u44a27612">Class常量池可以理解为是Class文件中的资源仓库。 Class文件中除了包含类的版本、字段、方法、接口等描述信息外，还有一项信息就是常量池(constant pool table)，用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。</span></p>
  <p data-lake-id="ua458c5db" id="ua458c5db"><br></p>
  <p data-lake-id="u996dcc25" id="u996dcc25" style="text-align: justify"><span data-lake-id="ue50f8e89" id="ue50f8e89">Class是用来保存常量的一个媒介场所，并且是一个中间场所。</span><strong><span data-lake-id="u697dde72" id="u697dde72">Class文件中的常量池部分的内容，会在运行期被运行时常量池加载进去。<br><br></span></strong></p>
  <h1 data-lake-id="y4apo" id="y4apo"><span data-lake-id="u80bcad26" id="u80bcad26">扩展知识</span></h1>
  <p data-lake-id="u242fae53" id="u242fae53"><br></p>
  <h2 data-lake-id="ZnBOm" id="ZnBOm"><span data-lake-id="u8df7b6da" id="u8df7b6da">查看Class常量池</span></h2>
  <p data-lake-id="u258fa64b" id="u258fa64b"><span data-lake-id="u4e4fce58" id="u4e4fce58">​</span><br></p>
  <p data-lake-id="uf9a7aa89" id="uf9a7aa89"><span data-lake-id="u17dff339" id="u17dff339">由于不同的Class文件中包含的常量的个数是不固定的，所以在Class文件的常量池入口处会设置两个字节的常量池容量计数器，记录了常量池中常量的个数。</span></p>
  <p data-lake-id="u430416af" id="u430416af"><span data-lake-id="u597d8d44" id="u597d8d44">​</span><br></p>
  <p data-lake-id="u4d0994bd" id="u4d0994bd"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1696936241650-d0243715-ff77-4920-b9b1-d1148365b16c.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_40%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u3c40cddf" id="u3c40cddf"><br></p>
  <p data-lake-id="u563a3ef8" id="u563a3ef8"><span data-lake-id="uf25951a7" id="uf25951a7">当然，还有一种比较简单的查看Class文件中常量池的方法，那就是通过</span><code data-lake-id="u74c5904f" id="u74c5904f"><span data-lake-id="u61933861" id="u61933861">javap</span></code><span data-lake-id="ufc9f9b50" id="ufc9f9b50">命令。对于以上的</span><code data-lake-id="u19acc320" id="u19acc320"><span data-lake-id="ua32705c9" id="ua32705c9">HelloWorld.class</span></code><span data-lake-id="u19638ce2" id="u19638ce2">，可以通过<br><br></span></p>
  <pre lang="java"><code>
javap -v  HelloWorld.class
</code></pre>
  <p data-lake-id="u64599aee" id="u64599aee"><br></p>
  <p data-lake-id="ued6e81f1" id="ued6e81f1"><span data-lake-id="u8c4c9057" id="u8c4c9057" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">查看常量池内容如下:</span></p>
  <p data-lake-id="u0f70dbfb" id="u0f70dbfb"><span data-lake-id="ud686ba03" id="ud686ba03" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">​</span><br></p>
  <p data-lake-id="ucdb3ad08" id="ucdb3ad08"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1696936273095-37316678-260d-4684-98a7-09f4ce95d3d0.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_19%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="uc4030640" id="uc4030640"><br></p>
  <p data-lake-id="ud390570e" id="ud390570e"><br></p>
  <blockquote data-lake-id="u42b1c089" id="u42b1c089">
   <p data-lake-id="u2e04ac4a" id="u2e04ac4a"><span data-lake-id="udb117d2b" id="udb117d2b">从上图中可以看到，反编译后的class文件常量池中共有16个常量。而Class文件中常量计数器的数值是0011，将该16进制数字转换成10进制的结果是17。</span></p>
   <p data-lake-id="ucb9c0878" id="ucb9c0878"><span data-lake-id="ued5e64ab" id="ued5e64ab">​</span><br></p>
   <p data-lake-id="u5673604f" id="u5673604f"><span data-lake-id="u09a583cb" id="u09a583cb">原因是与Java的语言习惯不同，常量池计数器是从0开始而不是从1开始的，常量池的个数是10进制的17，这就代表了其中有16个常量，索引值范围为1-16。</span></p>
  </blockquote>
  <p data-lake-id="ub26b8411" id="ub26b8411"><br></p>
  <p data-lake-id="u345d7708" id="u345d7708"><br></p>
 </body>
</html>